package com.browsesoft.baseadapter;

import java.util.Collection;
import java.util.Enumeration;
import java.util.Hashtable;
import java.util.Iterator;
import java.util.LinkedList;

/**
 * 执行条件查询
 */
public class BSQuery {
	public BSQuery() {
	}

	/**
	 * 根据条件得到结果
	 * 
	 * @param datas
	 *            查询数据集
	 * @param condition
	 *            条件
	 * @return 查询结果
	 * @throws Exception
	 */
	public static Collection getSearchDatas(Collection datas,
			Hashtable condition) throws Exception {
		Collection result = new LinkedList();
		result.addAll(datas);
		// 查询字段
		Enumeration en = condition.keys();
		// 对于每个查询字段
		while (en.hasMoreElements()) {
			// 查询字段
			String name = (String) en.nextElement();
			// 查询值
			String searchValue = (String) condition.get(name);
			result = searchInDatas(result, name, searchValue);
		}
		return result;
	}

	/**
	 * 查询
	 * 
	 * @param entitys
	 *            查询集合
	 * @param name
	 *            名
	 * @param searchValue
	 *            值
	 * @return 查询结果
	 */
	public static Collection searchInDatas(Collection entitys, String name,
			String searchValue) {
		Collection result = new LinkedList();
		result.addAll(entitys);
		Iterator iter = entitys.iterator();
		// 对于每个实体
		while (iter.hasNext()) {
			com.browsesoft.Entity entity = (com.browsesoft.Entity) iter.next();
			// 实际值
			String value = (String) entity.getAttributes().get(name);
			// 如果不为空
			if (value != null && !value.equals("")) {
				// 如果没有查到
				if (value.indexOf(searchValue) == -1) {
					result.remove(entity);
				}
			}
			// 如果取不到 是时间或数字
			else {
				// 如果是开始
				if (name.indexOf("_start") != -1) {
					String factName = name.substring(0, name.indexOf("_start"));
					value = (String) entity.getAttributes().get(factName);
					// 是日期型2004－02－09
					if (value.indexOf("-") != -1 && !value.startsWith("-")) {
						try {
							// 取日期
							value = value.substring(0, value.indexOf("-"))
									+ value.substring(value.indexOf("-") + 1,
											value.lastIndexOf("-"))
									+ value
											.substring(value.lastIndexOf("-") + 1);
							// 取查询日期
							String sValue = searchValue.substring(0,
									searchValue.indexOf("-"))
									+ searchValue.substring(searchValue
											.indexOf("-") + 1, searchValue
											.lastIndexOf("-"))
									+ searchValue.substring(searchValue
											.lastIndexOf("-") + 1);
							// 转换
							int start = Integer.parseInt(value);
							int searchStart = Integer.parseInt(sValue);
							if (start < searchStart) {
								// 去掉此对象
								result.remove(entity);
							}
						} catch (Exception e) {
							// 去掉此对象
							result.remove(entity);
						}
					}
					// 是数字
					else {
						try {
							// 如果转换不成功 ，不是数字
							float start = Float.parseFloat(value);
							float searchStart = Float.parseFloat(searchValue);
							// 如果比开始值小，不符合条件
							if (start < searchStart) {
								// 去掉此对象
								result.remove(entity);
							}
						} catch (Exception e) {
							// 去掉此对象
							result.remove(entity);
						}
					}
				}
				// 如果是结束
				else if (name.indexOf("_end") != -1) {
					String factName = name.substring(0, name.indexOf("_end"));
					value = (String) entity.getAttributes().get(factName);
					// 是日期型格式为2004－02－09
					if (value.indexOf("-") != -1 && !value.startsWith("-")) {
						try {
							// 取日期
							value = value.substring(0, value.indexOf("-"))
									+ value.substring(value.indexOf("-") + 1,
											value.lastIndexOf("-"))
									+ value
											.substring(value.lastIndexOf("-") + 1);
							// 取查询日期
							String sValue = searchValue.substring(0,
									searchValue.indexOf("-"))
									+ searchValue.substring(searchValue
											.indexOf("-") + 1, searchValue
											.lastIndexOf("-"))
									+ searchValue.substring(searchValue
											.lastIndexOf("-") + 1);
							// 转换
							int end = Integer.parseInt(value);
							int searchEnd = Integer.parseInt(sValue);
							// 如果比结束值大
							if (end > searchEnd) {
								// 去掉此对象
								result.remove(entity);
							}
						} catch (Exception e) {
							// 去掉此对象
							result.remove(entity);
						}
					}
					// 是数字
					else {
						try {
							// 如果转换不成功 ，不是数字
							float end = Float.parseFloat(value);
							float searchEnd = Float.parseFloat(searchValue);
							// 如果比结束值大，不符合条件
							if (end > searchEnd) {
								// 去掉此对象
								result.remove(entity);
							}
						} catch (Exception e) {
							// 去掉此对象
							result.remove(entity);
						}
					}
				}
				// 值为空
				else {
					// 去掉此对象
					result.remove(entity);
				}
			}
		}
		return result;
	}
}